package com.yangli.leecode.mashib.code;

public class Code02_GetMax {

    // 输入参数：n，一定要保证，n不是1就是0
    // n == 0 -> 1
    // n == 1 -> 0
    public static int flip(int n) {
        return n ^ 1;
    }

    // 输入参数n，可以是任何一个整数
    // 如果n是非负数，返回1(int)
    // 如果n是负数，返回0(int)
    public static int sign(int n) {
        return flip((n >> 31) & 1);
    }

    // a和b中，谁大返回谁
    public static int getMax1(int a, int b) {
        int c = a - b;
        int scA = sign(c); // c >= 0 scA = 1;   c < 0  scA = 0
        int scB = flip(scA);
        return a * scA + b * scB;
    }

    public static int getMax2(int a, int b) {
        int c = a - b; // c是a-b的差值，有可能溢出，也有可能不溢出
        int sa = sign(a); // a的符号，求出，a>=0  1,  a<0   0
        int sb = sign(b); // b的符号，求出，b>=0  1,  b<0   0
        int sc = sign(c); // c的符号，求出，c>=0  1,  c<0   0
        // 如果a和b的符号，不一样，difSab == 1
        // 如果a和b的符号，  一样，difSab == 0
        int difSab = sa ^ sb;
        // 如果a和b的符号，一样，sameSab == 1
        // 如果a和b的符号，不一样，sameSab == 0
        int sameSab = flip(difSab);
        int returnA = difSab * sa + sameSab * sc;
        int returnB = flip(returnA);
        return a * returnA + b * returnB;
    }

    public static void main(String[] args) {
        int a = -16;
        int b = 1;
        System.out.println(getMax1(a, b));
        System.out.println(getMax2(a, b));
        a = 2147483647;
        b = -2147480000;
        System.out.println(getMax1(a, b)); // wrong answer because of overflow
        System.out.println(getMax2(a, b));

    }

}